package com.quartet.modules.vehicle.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.quartet.modules.home.dto.TTerminalCurrentPositionResponseDto;
import com.quartet.modules.platform.dto.TTerminalAlarmDto;
import com.quartet.modules.platform.dto.TTerminalPositionDto;
import com.quartet.modules.platform.dto.vo.AlarmCountGroupCustomerDataVo;
import com.quartet.modules.statistics.dto.DataStatisticsGroupByTimeResponseDto;
import com.quartet.modules.statistics.dto.DataStatisticsRequestDto;
import com.quartet.modules.statistics.dto.StatisticsRequestDto;
import com.quartet.modules.vehicle.dto.*;
import com.quartet.modules.vehicle.entity.TTerminalPositionInfo;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 车辆位置表(TVehiclePositionInfo)表数据库访问层
 *
 * @author makejava
 * @since 2021-05-09 12:32:15
 */
public interface TTerminalPositionInfoDao extends BaseMapper<TTerminalPositionInfo> {

    /**
     * 查询终端位置信息
     *
     * @param tTerminalPositionInfoRequestDto
     * @return
     */
    List<TTerminalPositionInfoResponseDto> selectTerminalPositionPage(TTerminalPositionInfoRequestDto tTerminalPositionInfoRequestDto);

    /**
     * 查询终端位置轨迹信息
     *
     * @param tTerminalPositionInfoTrajectoryRequestDto
     * @return
     */
    List<TTerminalPositionInfoResponseDto> selectTerminalPositionTrajectoryPage(TTerminalPositionInfoTrajectoryRequestDto tTerminalPositionInfoTrajectoryRequestDto);

    /**
     * 查询终端位置轨迹坐标信息
     *
     * @param tTerminalPositionInfoTrajectoryRequestDto
     * @return
     */
    List<TTerminalPositionTrajectoryCoordinateResponseDto> selectTerminalPositionTrajectoryCoordinate(TTerminalPositionInfoTrajectoryRequestDto tTerminalPositionInfoTrajectoryRequestDto);

    /**
     * 查询当前终端的里程集合
     *
     * @param terminalCodeList
     * @return
     */
    List<Float> queryTotalMileage(@Param("terminalCodeList") List<String> terminalCodeList);

    /**
     * 获取最近一周的车辆位置信息
     *
     * @param startTime
     * @param terminalCodeList
     * @return
     */
    List<TTerminalPositionDto> queryTerminalPosition(@Param("startTime") LocalDateTime startTime, @Param("terminalCodeList") List<String> terminalCodeList);

    /**
     * 功能描述: 获取最近一周的车辆在线状体总数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/6/24 15:52
     * @param startTime
     * @param terminalCodeList
     * @return java.lang.Integer
     */
    List<TTerminalPositionDto> queryVehicleStatusTotalCountWhenOne(@Param("startTime") LocalDateTime startTime, @Param("terminalCodeList") List<String> terminalCodeList, @Param("type") Integer type);

    /**
     * 功能描述: 获取最近一周的车辆离线状体总数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/6/24 15:52
     * @param startTime
     * @param terminalCodeList
     * @return java.lang.Integer
     */
    List<TTerminalPositionDto> queryVehicleStatusTotalCountWhenZero(@Param("startTime") LocalDateTime startTime, @Param("terminalCodeList") List<String> terminalCodeList, @Param("type") Integer type);

    /**
     * 区域查终端
     * @param tTerminalPositionInfoRegionLookupRequestDto
     * @return
     */
    List<TTerminalPositionInfoResponseDto> selectTerminalPositionWithRegion(TTerminalPositionInfoRegionLookupRequestDto tTerminalPositionInfoRegionLookupRequestDto);

    /**
     * 历史区域查终端
     * @param tTerminalPositionInfoRegionLookupRequestDto
     * @return
     */
    List<TTerminalPositionInfoResponseDto> selectTerminalPositionWithHistoryRegion(TTerminalPositionInfoRegionLookupRequestDto tTerminalPositionInfoRegionLookupRequestDto);

    /**
     * 功能描述: 设备在线个数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/6/29 9:53
     * @param type
     * @return int
     */
    int queryTerminalOnLineNum(@Param("tTerminalCodeList")List<String> tTerminalCodeList,@Param("type") Integer type);

    /**
     * 功能描述: 设备离线个数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/6/29 9:57
     * @param type
     * @return int
     */
    int queryTerminalOffLineNum(@Param("tTerminalCodeList")List<String> tTerminalCodeList,@Param("type") Integer type);

    /**
     * 功能描述: 设备报警个数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/6/29 9:57
     * @param
     * @return int
     */
    int queryTerminalAlarmNum(@Param("tTerminalCodeList") List<String> tTerminalCodeList);

    /**
     * 功能描述: 获取车辆行驶里程的top10
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/7/5 11:02
     * @param tTerminalInfoList
     * @return java.util.List<com.quartet.modules.platform.dto.TTerminalPositionDto>
     */
    List<TTerminalPositionDto> queryTerminalMileageTop(@Param("tTerminalInfoList") List<String> tTerminalInfoList);

    /**
     * 功能描述: 当前在线设备个数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/7/5 11:18
     * @param tTerminalInfoList
     * @return int
     */
    int getOnlineTerminalCount(@Param("tTerminalInfoList") List<String> tTerminalInfoList,@Param("startTime") LocalDateTime startTime );

    /**
     * 功能描述: 查询终端报警信息数据
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/7/5 15:11
     * @param startTime
     * @return java.util.List<com.quartet.modules.platform.dto.TTerminalAlarmDto>
     */
    List<TTerminalAlarmDto> queryTerminalAlarmData(@Param("startTime") LocalDateTime startTime);

    /**
     *
     * @param startTime
     * @param alarmType
     * @return
     */
    Integer getAlarmTotalCountLastWeek(@Param("startTime") LocalDateTime startTime, @Param("alarmType") String alarmType);

    /**
     *  查询终端实时位置
     * @param tTerminalCodeList
     * @return
     */
    List<TTerminalCurrentPositionResponseDto> queryTerminalCurrentPosition(@Param("tTerminalCodeList")List<String> tTerminalCodeList);

    /**
     * 功能描述: 获取最近一周的车辆在线状体总数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/6/24 15:52
     * @param startTime
     * @param terminalCodeList
     * @param type
     * @return java.lang.Integer
     */
    List<TTerminalPositionDto> queryVehicleStatusTotalCountWhenTravel(@Param("startTime") LocalDateTime startTime, @Param("terminalCodeList") List<String> terminalCodeList, @Param("type") Integer type);

    /**
     * 功能描述: 获取最近一周的车辆停止状体总数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/6/24 15:52
     * @param startTime
     * @param terminalCodeList
     * @param type
     * @return java.lang.Integer
     */
    List<TTerminalPositionDto> queryVehicleStatusTotalCountWhenStop(@Param("startTime") LocalDateTime startTime, @Param("terminalCodeList") List<String> terminalCodeList, @Param("type") Integer type);

    /**
     * 查询此终端当前的里程数
     * @param terminalCode
     * @param localDateTime
     * @return
     */
    Float selectCurrentMileage(@Param("terminalCode") String terminalCode, @Param("localDateTime") LocalDateTime localDateTime);

    /**
     * 功能描述: 查询设备的总里程数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/8/3 10:35
     * @param startTime
     * @param terminalCodeList
     * @return java.util.List<com.quartet.modules.platform.dto.TTerminalPositionDto>
     */
    List<TTerminalPositionDto> queryTerminalMileage(@Param("startTime") LocalDateTime startTime, @Param("terminalCodeList") List<String> terminalCodeList);

    /**
     * 功能描述: 查询设备的总里程数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/8/3 10:35
     * @param startTime
     * @param terminalCodeList
     * @return java.util.List<com.quartet.modules.platform.dto.TTerminalPositionDto>
     */
    List<TTerminalPositionDto> queryTerminalSpeed(@Param("startTime") LocalDateTime startTime, @Param("terminalCodeList") List<String> terminalCodeList);

    /**
     * 功能描述: 车辆在线状态个数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/8/6 16:44
     * @param tTerminalCodeList
     * @param type
     * @return java.util.List<com.quartet.modules.platform.dto.TTerminalPositionDto>
     */
    int queryVehicleStatusOnLineNum(@Param("tTerminalCodeList") List<String> tTerminalCodeList, @Param("type") int type);

    /**
     * 功能描述: 查询最近一天的位置个数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/8/9 10:21
     * @param startTime
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionInfoDto>
     */
    List<TTerminalPositionInfoDto> queryPositionInfoByHour(@Param("startTime") LocalDateTime startTime);

    /**
     * 功能描述: 查询最近一周或者一月的位置个数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/8/9 10:33
     * @param startTime
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionInfoDto>
     */
    List<TTerminalPositionInfoDto> queryPositionInfoByDay(LocalDateTime startTime);

    /**
     * 功能描述: 查询最近一周或者一月的位置个数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/8/9 10:33
     * @param startTime
     * @param type
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionInfoDto>
     */
    List<TTerminalPositionInfoDto> queryOnLineTerminalGroup(@Param("startTime")LocalDateTime startTime,@Param("type") int type);

    /**
     * 功能描述: 客户维度统计报警个数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/8/9 10:33
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionInfoDto>
     */
    /*@Select("select tci.customer_name as customerName,ifnull(sum(json_length(ttpi.warning_mark_str)),0) as count from t_terminal_position_info ttpi\n" +
            "right join t_terminal_stock tti on tti.terminal_code=ttpi.terminal_code\n" +
            "right join t_order torder on torder.order_code=tti.order_code\n" +
            "right join t_customer_info tci on tci.customer_code=torder.customer_code\n" +
            "where tci.customer_name is not null\n" +
            "group by tci.customer_name")
    List<AlarmCountGroupCustomerDataVo> queryAlarmCountGroupCustomer();*/
    //同名方法执行速度太慢，使用以下接口暂时替代
    @Select("select  '澜湄项目' as customerName,ifnull(sum(json_length(ttpi.warning_mark_str)),0) as count from t_terminal_position_info ttpi\n" +
            "WHERE ttpi.alarm_status = 1")
    List<AlarmCountGroupCustomerDataVo> queryAlarmCountGroupCustomer();

    /**
     * 功能描述: 按照客户分组查询数据量个数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/11/19 20:41
     * @param statisticsRequestDto
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionCountGroupByCustomerDto>
     */
    List<TTerminalPositionCountGroupByCustomerDto> queryPositionCountGroupByCustomer(StatisticsRequestDto statisticsRequestDto);

    /**
     * 功能描述: 按照客户分组查询在线设备时间
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/11/19 20:41
     * @param statisticsRequestDto
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionCountGroupByCustomerDto>
     */
    List<TPositionTimeGroupByCustomerDto> queryPositionCountByType(@Param("statisticsRequestDto") StatisticsRequestDto statisticsRequestDto,@Param("type") int type);

    /**
     * 功能描述: 按照小时查询平台数据量
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/11/19 20:41
     * @param dataStatisticsRequestDto
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionCountGroupByCustomerDto>
     */
    List<DataStatisticsGroupByTimeResponseDto> queryPositionCountGroupByTimeHour(DataStatisticsRequestDto dataStatisticsRequestDto);

    /**
     * 功能描述: 按照天查询平台数据量
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/11/19 20:41
     * @param dataStatisticsRequestDto
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionCountGroupByCustomerDto>
     */
    List<DataStatisticsGroupByTimeResponseDto> queryPositionCountGroupByTimeDay(DataStatisticsRequestDto dataStatisticsRequestDto);

    /**
     * 功能描述: 按照月查询平台数据量
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/11/19 20:41
     * @param dataStatisticsRequestDto
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionCountGroupByCustomerDto>
     */
    List<DataStatisticsGroupByTimeResponseDto> queryPositionCountGroupByTimeMonth(DataStatisticsRequestDto dataStatisticsRequestDto);

    /**
     * 功能描述: 按照小时查询在线设备时长
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/11/19 20:41
     * @param dataStatisticsRequestDto
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionCountGroupByCustomerDto>
     */
    List<DataStatisticsGroupByTimeResponseDto> queryPositionCountByTimeHour(@Param("dataStatisticsRequestDto") DataStatisticsRequestDto dataStatisticsRequestDto,@Param("type") int type);

    /**
     * 功能描述: 按照天查询在线设备时长
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/11/19 20:41
     * @param dataStatisticsRequestDto
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionCountGroupByCustomerDto>
     */
    List<DataStatisticsGroupByTimeResponseDto> queryPositionCountByTimeDay(@Param("dataStatisticsRequestDto") DataStatisticsRequestDto dataStatisticsRequestDto,@Param("type") int type);

    /**
     * 功能描述: 按照月查询在线设备时长
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/11/19 20:41
     * @param dataStatisticsRequestDto
     * @return java.util.List<com.quartet.modules.vehicle.dto.TTerminalPositionCountGroupByCustomerDto>
     */
    List<DataStatisticsGroupByTimeResponseDto> queryPositionCountByTimeMonth(@Param("dataStatisticsRequestDto") DataStatisticsRequestDto dataStatisticsRequestDto,@Param("type") int type);

    /**
     * 功能描述: 查询活跃设备个数
     * @author huipanxing huipanxing@chinasofti.com
     * @date 2021/11/29 16:51
     * @param startTime
     * @return java.lang.Integer
     */
    Integer queryActiveTerminalCount(LocalDateTime startTime);

    /**
     * 获取当前的在线设备
     * @return
     */
    Integer  queryActiveTerminalCount1();
}
